// 662. [字符串模拟]多级嵌套TLV解析
// https://oj.rnd.huawei.com/problems/662/details
// TLV(Tag-Length-Value)，是一种简单实用的数据编码方案。其数据包一般包括三个域，
// 分别为：T域(标签Tag)，L域(长度Length)，V域(内容Value)
// TLV码流格式: 00 01 00 00 00 01 6f，字节均为十六进制，其中：
//码流中前 2 字节 00 01 为 T域，紧接着 4 字节 00 00 00 01 为 L域
//(假设值为len，此例为 1 )，后面的len个字节 6f 为 V域；
//字节序为大端序；T域最高位为 1 表示其V域内容为嵌套TLV，内容为1个或多个子TLV
// T域最高位为 0 表示其V域内容为字符串，个数由L域的值决定。
// 00 01 00 00 00 01 6f
// --T-- -----L----- V-

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <algorithm>
#include <iostream>
#include <sstream>
#include <string>
#include <utility>
#include <vector>
using namespace std;

#include <bits/stdc++.h>

class Solution {
 public:
  int StrToHexInteger(const string& str) {
    int res = 0;
    istringstream iss(str);
    iss >> hex >> res;
    return res;
  }

  void RecursiveHelper(istringstream& iss, vector<string>& res, int level,
                       int curCnt, int needCnt) {
    printf("needCnt=%d, curCnt=%d\n", needCnt, curCnt);
    for (auto rs : res) printf("%s, ", rs.c_str());
    printf("\n");
    string tag1, tag2, len1, len2, len3, len4;
    // read [TAG,LENGTH] 6 bytes
    while (iss >> tag1 >> tag2 >> len1 >> len2 >> len3 >> len4) {
      curCnt += 6;
      int tag = StrToHexInteger(tag1 + tag2);
      int len = StrToHexInteger(len1 + len2 + len3 + len4);
      if (tag < 0x8000) {
        string temp = to_string(level) + ":";
        // read [VALUE] len bytes
        for (int i = 0; i < len; ++i) {
          string ch;
          iss >> ch;
          temp += StrToHexInteger(ch);
        }
        curCnt += len;
        res.push_back(temp);
        if (curCnt >= needCnt) {
          return;
        }
      } else {
        RecursiveHelper(iss, res, level + 1, 0, len);
        curCnt += len;
      }
    }
  }
  // 待实现函数，在此函数中填入答题代码;
  vector<string> GetByte(const string& str) {
    vector<string> result;
    istringstream iss(str);
    // level
    // 嵌套层级，curCnt，当前嵌套层级读了几个字节，needCnt，当前嵌套层级需要读多少个字节
    RecursiveHelper(iss, result, 0, 0, INT_MAX);
    return result;
  }
};

// ================================
inline string ReadLine() {
  string line;
  getline(cin, line);
  return line;
}
template <typename T>
inline void WriteVector(const std::vector<T>& objects, char delimeter = ' ') {
  auto it = objects.begin();
  if (it == objects.end()) {
    return;
  }
  std::cout << *it;
  for (++it; it != objects.end(); ++it) {
    std::cout << delimeter << *it;
  }
}

int main_1908() {
  string hexStream = ReadLine();
  Solution solu;
  auto result = solu.GetByte(hexStream);
  WriteVector(result, '\n');
  return 0;
}
